package metiers;

import gestionOrdres.EcritureFichier;

import java.util.ArrayList;
import java.util.List;

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSetFactory;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.sparql.resultset.ResultSetRewindable;

/**
 * 
 * Nouvelle classe Requete. C'est ici qu'on exécute la requête,
 * qu'on envoie les résultats sous la bonne forme et qu'on récupère les
 * concepts de la requête.
 */
public class Requete {

	private String requete;
	private ResultSetRewindable tableauDonnees;
	private Concept conceptPrincipal;
	private List<Concept> concepts;


	public Requete(String requete) {
		this.requete = requete;
	}

	/**
	 * Cette méthode se connecte à dbpedia et récupère le résultat de la requête
	 */
	public void executerRequete() {
		String service = "http://fr.dbpedia.org/sparql";
		// String service = "http://dbpedia.org/sparql";

		// Interrogation du service.
		Query query = QueryFactory.create(requete);
		QueryExecution qExec = QueryExecutionFactory.sparqlService(service,
				query);
		tableauDonnees = ResultSetFactory.makeRewindable(qExec.execSelect());
	}

	/**
	 * Cette méthode enregistre le résultat de la requête sous forme d'un fichier CSV
	 * @param nomFichier
	 * 				: nom du fichier à créer
	 */
	public void enregistrerCSV() {
		String directory = System.getProperty("pfe.sparqlResult.dir");
		String filename = this.toString();
		EcritureFichier fichier = new EcritureFichier(directory,filename);
		ResultSetFormatter.outputAsCSV(fichier.getFlux(), tableauDonnees);
		tableauDonnees.reset();
	}

	/**
	 * Méthode qui parcourt la requête jusqu'au WHERE,
	 * et récupère le concept principal et la liste des concepts complémentaires. 
	 */
	public void recupererConcepts() {

		concepts = new ArrayList<Concept>();
		conceptPrincipal = new Concept("");

		int fin = requete.toUpperCase().indexOf("WHERE");
		int debut = requete.indexOf("?") + 1;

		String chaine = requete.substring(debut, fin);
		String delimiteur = "\\?";

		String[] result = chaine.split(delimiteur);

		conceptPrincipal.setNom(result[0]);

		for (int i = 1; i < result.length; i++) {

			Concept concept = new Concept(result[i].trim());
			concepts.add(concept);
		}

	}


	public String getRequete() {
		return requete;
	}

	public void setRequete(String requete) {
		this.requete = requete;
	}

	public ResultSetRewindable getTableauDonnees() {
		return tableauDonnees;
	}

	public void setTableauDonnees(ResultSetRewindable tableauDonnees) {
		this.tableauDonnees = tableauDonnees;
	}

	public Concept getConceptPrincipal() {
		return conceptPrincipal;
	}

	public void setConceptPrincipal(Concept conceptPrincipal) {
		this.conceptPrincipal = conceptPrincipal;
	}

	public List<Concept> getConcepts() {
		return concepts;
	}

	public void setConcepts(List<Concept> concepts) {
		this.concepts = concepts;
	}

	public static void main(String[] args) {
		Requete test = new Requete("SELECT ?p WHERE {?p ?o ?s} LIMIT 10");
		// test.recupererConceptPrincipal();
		// System.out.println(test.getConceptPrincipal());
		//		test.recupererConcepts();
		//		System.out.println(test.getConceptPrincipal());
		//		
		//		for (int i = 0; i < test.getConcepts().size(); i++) {
		//			System.out.println(test.getConcepts().get(i));
		//		}
		test.executerRequete();
		ResultSetFormatter.out(System.out, test.getTableauDonnees());
	}
}
